package com.study.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * 观察者模式
 * 定义了对象之间的一对多依赖，让多个观察者对象同时监听,某一个主题对象，当主题对象发生变化时，它的所有依赖者都会收到通知并更新
 * 符合开闭原则
 * 可以在运行时建立对象之间的关系
 *
 * 监听器的实现就是观察者模式 当监听到有扫描数据时另一边的对象立马做出反应
 */
public class ObserverTest {
    public static void main(String[] args) {

        Subject subject = new Subject();
        subject.addObserve( new Task1() );
        subject.addObserve( new Task2() );
        subject.notifyObserve("xxx");

    }
}


class Subject{

    //容器
    private List<Observe> list = new ArrayList<>();
    //add
    public void addObserve(Observe object){
        list.add(object);
    }
    //remove
    public void removeObserve(Observe object){
        list.remove(object);
    }
    //notify
    public void notifyObserve(Object object){
        list.stream().forEach(o->o.update(object));
    }

}


interface Observe{

    void update(Object object);

}

class Task1 implements Observe{

    @Override
    public void update(Object object) {
        System.out.println("Task1 receive notify: " +object);
    }
}

class Task2 implements Observe{

    @Override
    public void update(Object object) {
        System.out.println("Task2 receive notify: " +object);
    }
}